/**
 * map、filter、reduce
 */

// ---> map: 复制，遍历并复制原数组为新数组
//      原理：
//          1. map内部先创建一个新数组
//          2. 然后才是带着回调函数一起遍历原数组
//          3. 自动将回调函数在每个元素上执行一次，将回调函数的结果放入到新数组中相同的位置上
//          4. 遍历结束返回新数组
var oneList = [1, 2, 3, 4, 5, 6]
var newOneList = oneList.map(
    function (value, i, arr) {
        return value ** 2
    }
)
console.log(oneList) // [1, 2, 3 ,4, 5, 6]
console.log(newOneList) // [ 1, 4, 9, 16, 25, 36 ]

// ---> filter: 过滤，复制出原数组符合条件的元素组成新数组返回，原数组不变
//      原理：
//          1. map内部先创建一个新数组
//          2. 然后才是带着回调函数一起遍历原数组
//          3. 自动将回调函数的结果验证，如果为true则放入到新数组中
//          4. 遍历结束返回新数组
var filterOneList = oneList.filter(
    function (value, i, arr) {
        return value > 3
    }
)
console.log(oneList) // [1, 2, 3 ,4, 5, 6]
console.log(filterOneList) // [ 4, 5, 6 ]

// ---> reduce: 汇总，对数组中的元素进行统计得出最终结论
var reduceOneList = oneList.reduce(
    function (prev, elem, i, arr) {
        // prev: 保存到截止当前元素的临时汇总结果
        // return 将当前元素elem累加到prev中，得到新的汇总值
        return prev + elem
    }
)
console.log(oneList) // [1, 2, 3 ,4, 5, 6]
console.log(reduceOneList) // 21

// 统计一个字符串中每个字符出现的个数, 并且那个字符出现次数最多, 是几次?
var oneStr = "helloworld"
var oneStrToList = [...oneStr]
var res = oneStrToList.reduce((res, c) => {
    res[c] ? res[c]++ : res[c] = 1;
    return res
}, {})
console.log(res) // { h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1 }

function CharTotal() {
    var char, count
    for(var key in res) {
        if(char === undefined) {
            char = key
            count = res[key]
        } else {
            if(res[key] > count) {
                char = key
                count = res[key]
            }
        }
    }
    console.log(char, count) // l 3
}
CharTotal()
